﻿using QuanLyTiemVang.BUS;
using QuanLyTiemVang.Classes;
using QuanLyTiemVang.DAO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace QuanLyTiemVang.GUI
{
    /// <summary>
    /// Interaction logic for PhieuBanHang.xaml
    /// </summary>
    public partial class PhieuBanHang : Window, IPhanQuyenHelper
    {
        private decimal TongTien = 0;
        private decimal SoNo = 0;
        private class SanPhamView
        {
            public int MaSanPham { get; set; }
            public string TenSanPham { get; set; }
            public string LoaiSanPham { get; set; }
            public int SoLuongBan { get; set; }
            public int DonGia { get; set; }
            public decimal ThanhTien { get; set; }
        }

        private List<SanPhamView> listSanPhamView = new List<SanPhamView>();
        private List<SANPHAM> listSanPham = new List<SANPHAM>();
        private KHACHHANG kh = new KHACHHANG();
        public PhieuBanHang()
        {
            InitializeComponent();
            tbDonGia.MaxLength = 9;
            txtTongCong.Text = "0";
            List<PHIEUBANHANG> l = PhieuBanHangDAO.GetAllPhieuBanHang();
            if (l.Count == 0)
            {
                this.txtMaPhieu.Text = "1";
            }
            else
            {
                this.txtMaPhieu.Text = (l[l.Count - 1].MaPhieuBanHang + 1).ToString();
            }

            this.dpNgayBan.SelectedDate = DateTime.Now.Date;
            this.dpNgayBan.IsEnabled = false;
        }
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            // Begin dragging the window
            this.DragMove();
        }
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            dgDanhSachSanPham.ItemsSource = listSanPhamView.ToList();
            dpNgayBan.SelectedDate = DateTime.Now.Date;
            dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
            cbMaKhachHang.ItemsSource = KhachHangDAO.GetAllKhachHangId();
            cbMaSanPham.ItemsSource = SanPhamDAO.GetAllSanPhamId();

            this.Clear();
        }

        private void cbMaKhachHang_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            txtSoTienThanhToan.IsEnabled = true;
            if (cbMaKhachHang.SelectedItem != null)
            {
                kh.MaKhachHang = int.Parse(cbMaKhachHang.SelectedValue.ToString());
                kh = KhachHangDAO.SelectKhachHangByMaKhachHang(kh);
                txtTenKhachHang.Text = kh.TenKhachHang;
                txtSoTienNo.Text = String.Format("{0:0}", kh.TienNoHienTai);
                SoNo = decimal.Parse(kh.TienNoHienTai.ToString());
                txtDiaChi.Text = kh.DiaChi;

                if (kh.LOAIKHACHHANG.TenLoaiKhachHang.Contains("Khách quen"))
                {
                    this.btnLapPhieuNo.Visibility = System.Windows.Visibility.Visible;
                    this.txtSoTienThanhToan.IsEnabled = true;
                }
                else
                {
                    this.btnLapPhieuNo.Visibility = System.Windows.Visibility.Collapsed;
                    this.txtSoTienThanhToan.IsEnabled = false;
                }
            }
        }

        private void dpNgayBan_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayBan.SelectedDate.HasValue)
            {
                if (dpNgayBan.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày bán phải lớn hơn hoặc bằng ngày lập phiếu hiện tại.");
                    dpNgayBan.SelectedDate = DateTime.Now.Date;
                }
            }
        }

        private void dpNgayThanhToan_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayThanhToan.SelectedDate.HasValue)
            {
                if (dpNgayThanhToan.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày thanh toán phải lớn hơn hoặc bằng ngày lập phiếu hiện tại.");
                    dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
                }
            }
        }

        private void dgDanhSachSanPham_LoadingRow_1(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();

        }

        private void dgDanhSachSanPham_RowEditEnding_1(object sender, DataGridRowEditEndingEventArgs e)
        {
            SanPhamView sp = dgDanhSachSanPham.SelectedItem as SanPhamView;
            SanPhamView h = new SanPhamView();
            h.TenSanPham = sp.TenSanPham;
            h.DonGia = sp.DonGia;
            h.SoLuongBan = sp.SoLuongBan;
            h.ThanhTien = (decimal)h.SoLuongBan * (decimal)h.DonGia;
            listSanPhamView.Remove(sp);
            listSanPhamView.Add(h);

            dgDanhSachSanPham.ItemsSource = null;
            dgDanhSachSanPham.ItemsSource = listSanPham;
        }

        private void dgDanhSachSanPham_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                var dataGrid = (DataGrid)sender;
                for (int i = 0; i < listSanPhamView.Count; i++)
                {
                    listSanPhamView.Remove((SanPhamView)dataGrid.SelectedItem);
                }

                dgDanhSachSanPham.ItemsSource = null;
                dgDanhSachSanPham.ItemsSource = listSanPhamView;

                decimal tongTien = 0;
                foreach (SanPhamView item in listSanPhamView)
                {
                    tongTien += item.ThanhTien;
                }

                txtTongCong.Text = tongTien.ToString();         
            }
        }

        void IPhanQuyenHelper.SetAdminFunction()
        {
        }

        void IPhanQuyenHelper.SetStaffFunction()
        {
        }

        void IPhanQuyenHelper.SetCustomerFunction()
        {
        }

        void IPhanQuyenHelper.SetNonFunction()
        {
            this.Close();
        }

        private void PreviewTextInput_TextBox_Event_Handler(object sender, TextCompositionEventArgs e)
        {
            int result;
            if (!(int.TryParse(e.Text, out result)))
            {
                e.Handled = true;
            }
        }

        

        private void tbDonGia_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbSoLuongBan.Text != string.Empty)
            {
                if (tbDonGia.Text == string.Empty)
                {
                    tbThanhTien.Text = string.Empty;
                    return;
                }
                else if (uint.Parse(tbDonGia.Text.ToString()) <= 0)
                {
                    tbDonGia.Text = string.Empty;
                    tbThanhTien.Text = string.Empty;
                    return;
                }
                else
                {
                    tbThanhTien.Text = Convert.ToString(Decimal.Parse(tbSoLuongBan.Text.ToString()) * Decimal.Parse(tbDonGia.Text.ToString()));
                }
            }
        }

        private void btnThemSanPham_Click(object sender, RoutedEventArgs e)
        {
            if (cbMaSanPham.SelectedIndex == -1)
            {
                MessageBox.Show("Chưa chọn sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (tbSoLuongBan.Text == string.Empty || tbSoLuongBan.Text == "0")
            {
                MessageBox.Show("Chưa nhập vào số lượng hoặc số lượng bằng 0.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (tbDonGia.Text == string.Empty || tbDonGia.Text == "0")
            {
                MessageBox.Show("Chưa nhập vào đơn giá hoặc đơn giá bằng 0.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else
            {
                if (tbDonGia.Text.Length < 4)
                {
                    MessageBox.Show("Đơn giá phải nhập tối thiểu là 1000 đồng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            
            SANPHAM sp = SanPhamDAO.GetAllSanPham().Where(m => m.MaSanPham == int.Parse(cbMaSanPham.SelectedValue.ToString())).Single();
            SanPhamView spv = new SanPhamView() 
            {
                MaSanPham = sp.MaSanPham,
                TenSanPham = sp.TenSanPham,
                LoaiSanPham = sp.LOAISANPHAM.TenLoaiSanPham,
                SoLuongBan = int.Parse(tbSoLuongBan.Text.ToString()),
                DonGia = int.Parse(tbDonGia.Text.ToString()),
                ThanhTien = decimal.Parse(tbThanhTien.Text.ToString()),
            };

            foreach (var item in listSanPhamView)
            {
                if ((int)cbMaSanPham.SelectedItem == item.MaSanPham)
                {
                    MessageBox.Show("Sản phẩm đã tồn tại trong danh sách.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }

            TongTien += spv.ThanhTien;
            txtTongCong.Text = TongTien.ToString();
            txtSoTienThanhToan.Text = TongTien.ToString();
            listSanPhamView.Add(spv);
            dgDanhSachSanPham.ItemsSource = listSanPhamView.ToList();
            cbMaSanPham.Text = "";
            tbTenSanPham.Clear();
            tbSoLuongTon.Clear();
            tbSoLuongBan.Clear();
            tbThanhTien.Clear();
            tbDonGia.Clear();
        }

        private void txtSoTienThanhToan_TextChanged(object sender, TextChangedEventArgs e)
        {
            
            if (txtSoTienThanhToan.Text == string.Empty)
            {
                //txtSoTienNo.Text = string.Empty;
               // return;
            }
            else if (decimal.Parse(txtSoTienThanhToan.Text.ToString()) < 0 || decimal.Parse(txtSoTienThanhToan.Text.ToString()) > SoNo + decimal.Parse(txtTongCong.Text.ToString()))
            {
                MessageBox.Show("Tổng tiền thanh toán không được lớn hơn tổng tiền phải trả.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                txtSoTienThanhToan.Text = TongTien.ToString();
                txtSoTienNo.Text = String.Format("{0:0}", SoNo);
                return;
            }
            if (txtSoTienThanhToan.Text != string.Empty)
            {
                decimal no = SoNo;
                decimal tongcong = decimal.Parse(txtTongCong.Text.ToString());
                decimal thanhtoan = decimal.Parse(txtSoTienThanhToan.Text.ToString());
                no += tongcong - thanhtoan;
                txtSoTienNo.Text = String.Format("{0:0}", no);
            }
        }

        private void btnLapPhieu_Click(object sender, RoutedEventArgs e)
        {
            //dieu kien de co the lap phieu ban hang
            if (cbMaKhachHang.SelectedItem == null)
            {
                MessageBox.Show("Chưa chọn khách hàng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (listSanPhamView.Count <= 0)
            {
                MessageBox.Show("Chưa có thông tin các sản phẩm.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            MessageBoxResult result = MessageBox.Show("Bạn có chắc chắn muốn lập phiếu bán hàng với những thông tin trên không?", "Xác nhận lập phiếu", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
                return;

            //du dieu kien lap phieu ban hang
            //Kiểm tra báo cáo tồn
            List<BAOCAOTON> lstBaoCaoTon = BaoCaoTonDAO.SelectAllBaoCaoTon();
            int maBaoCaoTon = 0;
            if (lstBaoCaoTon != null)
                foreach (var bct in lstBaoCaoTon)
                {
                    if (bct.NgayBaoCao.Value.Date.Month == DateTime.Now.Date.Month && bct.NgayBaoCao.Value.Date.Year == DateTime.Now.Date.Year)
                    {
                        maBaoCaoTon = bct.MaBaoCaoTon;
                    }
                }

            if (maBaoCaoTon == 0)
            {
                BAOCAOTON bct = new BAOCAOTON
                {
                    NgayBaoCao = DateTime.Now.Date
                };
                BaoCaoTonBUS.ThemBaoCaoTon(bct);
                maBaoCaoTon = bct.MaBaoCaoTon;
                List<SANPHAM> lstSP = SanPhamDAO.GetAllSanPham();
                if (lstSP != null)
                {
                    foreach (var item in lstSP)
                    {
                        CHITIETBAOCAOTON CTBCT = new CHITIETBAOCAOTON
                        {
                            MaBaoCaoTon = maBaoCaoTon,
                            MaSanPham = item.MaSanPham,
                            TonDauKy = item.SoLuongTon,
                            SoLuongBan = 0,
                            SoLuongMua = 0,
                            TonCuoiKy = item.SoLuongTon
                        };

                        ChiTietBaoCaoTonBUS.ThemChiTietBaoCaoTon(CTBCT);
                    }
                }
            }
            //kiem tra va lap danh sach khoan thu
            DANHSACHKHOANTHU danhsachkhoanthu = DanhSachKhoanThuDAO.getMaDanhSachKhoanThu(dpNgayBan.SelectedDate.Value);
            if (danhsachkhoanthu == null)
            {
                danhsachkhoanthu = new DANHSACHKHOANTHU()
                {
                    NgayThu = dpNgayBan.SelectedDate.Value,
                    TienThuPhieuBanHang = 0,
                    TienThuPhieuDichVu = 0,
                    TongTienThu = 0,
                };
                DanhSachKhoanThuDAO.Insert(danhsachkhoanthu);
            }

            //lap phieu ban hang
            PHIEUBANHANG phieubanhang = new PHIEUBANHANG()
            {
                MaDanhSachKhoanThu = danhsachkhoanthu.MaDanhSachKhoanThu,
                MaKhachHang = int.Parse(cbMaKhachHang.SelectedValue.ToString()),
                NgayBan = dpNgayBan.SelectedDate.Value,
                NgayThanhToan = dpNgayThanhToan.SelectedDate.Value,
                TongCong = decimal.Parse(txtTongCong.Text.ToString()),
                SoTienThanhToan = decimal.Parse(txtSoTienThanhToan.Text.ToString()),
                SoTienNo = decimal.Parse(txtSoTienNo.Text.ToString()),

            };
            PhieuBanHangDAO.Insert(phieubanhang);

            //tao va them vao database danh sach chi tiet phieu ban hang
            for (int i = 0; i < listSanPhamView.Count; i++)
            {

                int maSP = listSanPhamView[i].MaSanPham;
                SANPHAM sanpham = SanPhamDAO.GetAllSanPham().Where(m => m.MaSanPham == maSP).Single();

                //lap va them vao database tung chi tiet phieu ban hang
                CHITIETPHIEUBANHANG chitietphieubanhang = new CHITIETPHIEUBANHANG()
                {
                    MaPhieuBanHang = phieubanhang.MaPhieuBanHang,
                    MaSanPham = sanpham.MaSanPham,
                    SoLuongBan = listSanPhamView[i].SoLuongBan,
                    DonGiaTien = (decimal)listSanPhamView[i].DonGia,
                    ThanhTien = listSanPhamView[i].ThanhTien,
                };

                ChiTietPhieuBanHangDAO.Insert(chitietphieubanhang);
                //Cập nhật số lượng tồn của sản phẩm
                sanpham.SoLuongTon -= listSanPhamView[i].SoLuongBan;
                SanPhamBUS.CapNhatSanPham(sanpham);
                //Thêm vào báo cáo tồn
                List<CHITIETBAOCAOTON> lstCTBCT = ChiTietBaoCaoTonDAO.SelectAllChiTietBaoCaoTon();
                CHITIETBAOCAOTON CT = null;
                if(lstCTBCT != null)
                    foreach (var ct in lstCTBCT)
                    {
                        if (ct.MaBaoCaoTon == maBaoCaoTon && ct.MaSanPham == sanpham.MaSanPham)
                            CT = ct;
                    }
                if (CT != null)
                {
                    CT.SoLuongBan += listSanPhamView[i].SoLuongBan;
                    CT.TonCuoiKy = sanpham.SoLuongTon;
                    ChiTietBaoCaoTonBUS.CapNhatChiTietBaoCaoTon(CT);
                }
                
            }

            //cap nhat thong tin no trong bang khach hang
            kh.TienNoHienTai = decimal.Parse(txtSoTienNo.Text.ToString());
            KhachHangDAO.UpdateTienNo(kh);

            //cap nhat thong tin bang danh sach khoan thu
            danhsachkhoanthu.TienThuPhieuBanHang += decimal.Parse(txtSoTienThanhToan.Text.ToString());
            danhsachkhoanthu.TongTienThu = (decimal)danhsachkhoanthu.TienThuPhieuBanHang + (decimal)danhsachkhoanthu.TienThuPhieuDichVu;
            DanhSachKhoanThuDAO.UpdateKhoanThu(danhsachkhoanthu);

            result = MessageBox.Show("Lập phiếu thành công. Bạn có muốn in phiếu hay không?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
            {
                this.Clear();
                return;
            }

            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
            sfd.Filter = "PDF File|*.pdf";
            sfd.FileName = "PBH_" + this.txtMaPhieu.Text;
            System.Windows.Forms.DialogResult r = sfd.ShowDialog();
            if (r == System.Windows.Forms.DialogResult.Cancel)
            {
                this.Clear();
                return;
            }

            ReportBUS.PhieuBanHangReport(phieubanhang.MaPhieuBanHang, sfd.FileName);
            MessageBox.Show("Đã in phiếu thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

            this.Clear();
        }

        private void Clear()
        {
            txtMaPhieu.Text = PhieuBanHangDAO.GetLastMaPhieuBanHang().ToString();
            tbSoLuongTon.Text = string.Empty;
            tbSoLuongBan.Text = string.Empty;
            tbDonGia.Text = string.Empty;
            cbMaKhachHang.SelectedItem = null;
            dpNgayThanhToan.SelectedDate = DateTime.Now.Date;
            dpNgayBan.SelectedDate = DateTime.Now.Date;
            txtTenKhachHang.Text = string.Empty;
            txtDiaChi.Text = string.Empty;
            cbMaSanPham.SelectedItem = null;
            //tbSoLuongMua.Text = string.Empty;
            tbThanhTien.Text = string.Empty;
            txtTongCong.Text = "0";
            txtSoTienThanhToan.Text = string.Empty;
            txtSoTienNo.Text = string.Empty;
            TongTien = 0;
            SoNo = 0;
            //listSanPhamView.RemoveRange(0, this.listSanPham.Count);
            listSanPhamView.Clear();
            dgDanhSachSanPham.ItemsSource = listSanPhamView.ToList();
            //dgDanhSachSanPham.ItemsSource = null;

            txtSoTienThanhToan.IsEnabled = false;
            txtTenKhachHang.IsEnabled = false;
        }
        private void btnTaoPhieuMoi_Click(object sender, RoutedEventArgs e)
        {
            this.Clear();
        }

        private void cbLoaiSanPham_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbMaSanPham.SelectedValue == null)
            {
                return;
            }
            tbSoLuongBan.Text = string.Empty;
            tbDonGia.Text = string.Empty;
            SANPHAM sanpham = new SANPHAM()
            {
                MaSanPham = int.Parse(cbMaSanPham.SelectedValue.ToString()),
            };

            sanpham = SanPhamDAO.SelectSanPhamByMaSanPham(sanpham);
            int slBanTemp = 0;
            foreach (var item in listSanPhamView)
            {
                if (item.MaSanPham == sanpham.MaSanPham)
                    slBanTemp += item.SoLuongBan;
            }
            tbSoLuongTon.Text = (sanpham.SoLuongTon - slBanTemp).ToString();
            tbTenSanPham.Text = sanpham.TenSanPham.ToString();
        }

        private void tbSoLuongBan_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbSoLuongBan.Text == string.Empty)
            {                
                return;
            }
            else
            {
                if ((int.Parse(tbSoLuongBan.Text.ToString()) > int.Parse(tbSoLuongTon.Text.ToString())))
                {
                    MessageBox.Show("Không đủ hàng.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                    tbSoLuongBan.Text = tbSoLuongTon.Text;
                    return;
                }
            }

            if (tbSoLuongBan.Text.ToString() != string.Empty && tbDonGia.Text.ToString() != string.Empty)
            {
                decimal thanhtien = Decimal.Parse(tbSoLuongBan.Text.ToString()) * Decimal.Parse(tbDonGia.Text.ToString());
                tbThanhTien.Text = thanhtien.ToString();
            }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnLapPhieuNo_Click(object sender, RoutedEventArgs e)
        {
            if (cbMaKhachHang.SelectedItem == null)
            {
                MessageBox.Show("Chưa chọn khách hàng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (decimal.Parse(txtSoTienNo.Text) == 0)
            {
                MessageBox.Show("Khách hàng không có nợ.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }
            PhieuNo phieuno = new PhieuNo();
            decimal x;
            if (txtSoTienThanhToan.Text == "")
            {
                phieuno.SoTienTra = 0;
            }
            else
            {
                if (decimal.TryParse(txtSoTienThanhToan.Text, out x) == true)
                {
                    phieuno.SoTienTra = x;
                }
            }
            phieuno.MaKhachHang = (int)cbMaKhachHang.SelectedItem;
            phieuno.SetPhieuNoForBanHang(true);
            phieuno.Show();
        }

        private void btnTraCuuKhachHang_Click(object sender, RoutedEventArgs e)
        {
            DanhSachKhachHang danhsachKH = new DanhSachKhachHang();
            danhsachKH.Show();
            //this.Hide();
        }

        private void btnThemKhachHang_Click(object sender, RoutedEventArgs e)
        {
            DangKyTaiKhoan dangky = new DangKyTaiKhoan();
            dangky.Show();
            //this.Hide();
        }

    }
}
